iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
1
自我挑戰組

Android 菜鳥村-開發基礎 30篇系列 第 20

[Day 18] Kotlin 列舉 Emun class , Sealed class

  • 分享至 

  • xImage
  •  

Emun class

如何去定義


enum class Commodity {

RICE,

BEER ,

SUGER,

    
}

獲取 Emun class 單一 常量



fun main (){
    
 
    val item = Commodity.valueOf("RICE")
    
     println(item.toString())
    
    
}

// result
// RICE

獲取 Emun class 所有常量


fun main (){
    
 
    val totalkinds= Commodity.values()
    
     totalkinds.forEach { println(it.toString()) }
    
     
}

// result
//RICE
//BEER
//SUGER

Constructor 宣告 property

在 Commodity 的 Constructor 中 , 宣告 property "price"

enum class Commodity ( val price : Int){

RICE(100) ,

BEER(50) , 

SUGER(30) ;

}

Constructor 添加方法

添加方法時需要加上分號


enum class Commodity ( val price : Int){

RICE(100) ,

BEER(50) , 

SUGER(30) ;

fun getCurrentPrice () = price
    
}

實現 Interface


interface Shop {
    
   fun  CaculatePrice (amount:Int):Int
    
}

enum class Commodity (val price : Int):Shop{

RICE(100)  ,

BEER(50)   , 

SUGER(30)  ;

override fun CaculatePrice (amount:Int) = price * amount
    
}
   
}


Sealed class

sealed class 傳遞變數

sealed class subclass 如果沒傳遞變數 , 只會是一個 單純 的 object



sealed class ResponseStatus
{

//傳遞參數
data class Success(val data : MutableList<Int> ) : ResponseStatus()
// 傳遞參數
data class Erro(val errorMessage :String ) : ResponseStatus()
// 沒傳遞參數
object Fail : ResponseStatus()

}

表達情形

當在when表達式中使用密封類時,需要涵蓋所有情況, object 可以不加上 is 做判斷 (判斷一般類別需要加上 is 判斷類別)



 fun getResponseStatus (status:ResponseStatus){
     
    when (status){
        
        is ResponseStatus.Success -> setNewdata (status.data )
        
        is ResponseStatus.Error -> showSendInvaild (status.errorMessage)
         
          ResponseStatus.Failure ->  showSendInvaild ("請檢查網路連線")
        
        
    } 
     
     
 }


也可以 用 if else 代替 , 只要有包含所有情況即可




fun getResult(result:ResponseStatus) {

     if(status is ResponseStatus.Success) setNewdata (status.data )
     
      
     if(status is ResponseStatus.Error) showSendInvaild (status.errorMessage)
     
     else  showSendInvaild ("請檢查網路連線")  


}



使用注意

是 abstract,不能直接實例化,可以具有 abstract member。

Constructor 是 private 不能為 public。

和他的 subclass 需要放在同一個 file

Extend Sealed class 的 subclass 的 class(間接繼承者)可以放置在任何位置,而不必放在同一 file 中。


上一篇
[Day 17] Kotlin 泛型
下一篇
[Day 19] Android Activity lifecycle
系列文
Android 菜鳥村-開發基礎 30篇32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言